import { NextRequest, NextResponse } from 'next/server';
import { systemPrompt } from './system-prompt';

// DeepSeek API的响应处理
const generateTravelResponse = async (prompt: string): Promise<Response> => {
  // 从环境变量获取API密钥
  const apiKey = process.env.DEEPSEEK_API_KEY;
  
  // 检查API密钥是否设置
  if (!apiKey || apiKey === 'your-api-key-here') {
    console.warn('DeepSeek API密钥未设置或使用默认值，将使用备用响应');
    return generateFallbackResponse(prompt);
  }
  
  // 调用DeepSeek API
  try {
    // 构建请求体
    const requestBody = {
      model: 'deepseek-chat',  // 或使用其他可用的DeepSeek模型
      messages: [
        { role: 'system', content: systemPrompt },
        { role: 'user', content: prompt }
      ],
      stream: true,  // 启用流式响应
      temperature: 0.7,  // 控制创造性，0.0-1.0
      max_tokens: 1000,  // 最大生成令牌数
      top_p: 0.95,  // 控制输出多样性
      presence_penalty: 0.0,  // 控制主题重复
      frequency_penalty: 0.0  // 控制词汇重复
    };
    
    // 发送请求到DeepSeek API
    const response = await fetch('https://api.deepseek.com/v1/chat/completions', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${apiKey}`
      },
      body: JSON.stringify(requestBody)
    });
    
    // 检查响应状态
    if (!response.ok) {
      const errorText = await response.text();
      console.error(`DeepSeek API错误 (${response.status}): ${errorText}`);
      throw new Error(`DeepSeek API响应错误: ${response.status}`);
    }
    
    return response;
  } catch (error) {
    console.error('调用DeepSeek API时出错:', error);
    // 如果API调用失败，返回备用响应
    return generateFallbackResponse(prompt);
  }
};

// 生成备用响应（当API调用失败时使用）
const generateFallbackResponse = (prompt: string): Response => {
  console.log('使用备用响应数据');
  let responseText = '旅游助手暂时无法连接到DeepSeek API，正在使用备用数据。\n\n';
  
  // 添加备用响应内容
  const fallbackContent = getFallbackContent(prompt);
  responseText += fallbackContent;
  
  // 确保响应文本是有效的UTF-8编码
  const normalizedText = responseText.normalize('NFC');
  const encoder = new TextEncoder();
  const encodedText = encoder.encode(normalizedText);
  
  return new Response(encodedText, {
    status: 200,
    headers: {
      'Content-Type': 'text/plain; charset=utf-8',
      'Cache-Control': 'no-cache',
      'X-Content-Type-Options': 'nosniff',
    },
  });
};

// 获取备用响应内容
const getFallbackContent = (prompt: string): string => {
  // 备用模拟响应数据
  const travelResponses: Record<string, string> = {
    '北京': `北京是中国的首都，有许多著名景点如故宫、长城、天坛等。

以下是为期4天的北京行程建议：

第1天：
- 上午：游览天安门广场和故宫博物院
- 中午：在故宫附近的老舍茶馆品尝北京特色茶点
- 下午：参观天坛公园
- 晚上：品尝北京烤鸭

第2天：
- 上午：游览八达岭长城
- 中午：在长城附近农家乐用餐
- 下午：参观明十三陵
- 晚上：欣赏功夫表演

第3天：
- 上午：游览颐和园
- 中午：在颐和园附近用餐
- 下午：参观圆明园遗址
- 晚上：在什刹海酒吧街体验北京夜生活

第4天：
- 上午：游览798艺术区
- 中午：在艺术区内特色餐厅用餐
- 下午：参观国家博物馆
- 晚上：在王府井步行街购物

最佳旅游季节：春季（4-5月）和秋季（9-10月），气候宜人，适合户外活动。

交通建议：北京地铁网络发达，可以购买交通卡。重要景点之间可以乘坐地铁或出租车。

住宿建议：可以选择王府井、西单或三里屯附近的酒店，交通便利，周边设施齐全。`,
    
    '上海': `上海是中国的经济中心，有外滩、东方明珠、迪士尼乐园等景点。

以下是为期3天的上海行程建议：

第1天：
- 上午：游览外滩，欣赏黄浦江两岸风光
- 中午：在南京路步行街附近用餐
- 下午：参观上海博物馆
- 晚上：乘坐黄浦江游船，欣赏夜景

第2天：
- 上午：游览豫园和城隍庙
- 中午：品尝南翔小笼包等上海特色小吃
- 下午：参观上海迪士尼乐园
- 晚上：继续游玩迪士尼乐园，观看烟花表演

第3天：
- 上午：游览田子坊和新天地
- 中午：品尝本帮菜
- 下午：登陆东方明珠或上海中心观景台
- 晚上：在南京西路购物

最佳旅游季节：春季（4-5月）和秋季（9-11月），气候宜人。

交通建议：上海地铁网络发达，可以购买交通卡。重要景点之间可以乘坐地铁或出租车。

住宿建议：可以选择南京东路、人民广场或徐家汇附近的酒店，交通便利，周边设施齐全。`,
    
    '广州': `广州是中国南方的重要城市，有陈家祠、白云山、沙面等景点。

以下是为期3天的广州行程建议：

第1天：
- 上午：游览陈家祠
- 中午：品尝广州早茶
- 下午：参观广州博物馆和越秀公园
- 晚上：在北京路步行街购物

第2天：
- 上午：游览白云山
- 中午：在白云山附近用餐
- 下午：参观广州塔（小蛮腰）
- 晚上：珠江夜游

第3天：
- 上午：游览沙面岛
- 中午：品尝沙面附近的西餐
- 下午：参观上下九步行街
- 晚上：品尝广州特色美食

最佳旅游季节：秋冬季（10月至次年3月），气候凉爽干燥。

交通建议：广州地铁网络发达，可以购买交通卡。重要景点之间可以乘坐地铁或出租车。

住宿建议：可以选择天河区、越秀区或荔湾区的酒店，交通便利，周边设施齐全。`,
    
    '深圳': `深圳是中国的科技创新中心，有世界之窗、欢乐谷、大梅沙等景点。

以下是为期3天的深圳行程建议：

第1天：
- 上午：游览深圳世界之窗
- 中午：在景区内用餐
- 下午：继续游览世界之窗
- 晚上：在华强北电子街区购物

第2天：
- 上午：游览深圳欢乐谷
- 中午：在景区内用餐
- 下午：继续游览欢乐谷
- 晚上：在海岸城购物中心购物和用餐

第3天：
- 上午：游览大梅沙海滩
- 中午：品尝海鲜
- 下午：参观深圳博物馆
- 晚上：在深圳湾公园散步

最佳旅游季节：秋冬季（10月至次年4月），气候凉爽舒适。

交通建议：深圳地铁网络发达，可以购买交通卡。重要景点之间可以乘坐地铁或出租车。

住宿建议：可以选择福田区、罗湖区或南山区的酒店，交通便利，周边设施齐全。`,
    
    '杭州': `杭州以西湖闻名，有西湖、灵隐寺、西溪湿地等景点。

以下是为期3天的杭州行程建议：

第1天：
- 上午：游览西湖（苏堤、白堤）
- 中午：品尝杭帮菜
- 下午：游览雷峰塔和三潭印月
- 晚上：观看《印象西湖》表演

第2天：
- 上午：游览灵隐寺和飞来峰
- 中午：品尝素斋
- 下午：参观西溪湿地
- 晚上：在清河坊历史街区散步

第3天：
- 上午：游览宋城
- 中午：在宋城品尝特色美食
- 下午：参观中国茶叶博物馆，体验茶文化
- 晚上：在湖滨银泰购物

最佳旅游季节：春季（3-5月）和秋季（9-11月），气候宜人，西湖景色最美。

交通建议：杭州公共交通发达，可以购买交通卡。西湖周边可以步行或乘坐观光车游览。

住宿建议：可以选择西湖周边或武林广场附近的酒店，交通便利，周边设施齐全。`,
  };

  // 检查是否包含城市名称
  for (const city in travelResponses) {
    if (prompt.toLowerCase().includes(city.toLowerCase())) {
      return travelResponses[city];
    }
  }

  // 处理其他类型的旅游问题
  if (prompt.includes('最佳旅游季节') || prompt.includes('什么时候去')) {
    return '中国不同地区的最佳旅游季节各不相同：\n\n北方地区（如北京、哈尔滨）：春季（4-5月）和秋季（9-10月）气候宜人，适合旅游。\n南方地区（如广州、深圳）：秋冬季（10月至次年3月）气候凉爽干燥，较为舒适。\n西南地区（如成都、昆明）：春秋两季气候宜人，夏季较为凉爽。\n沿海城市（如青岛、厦门）：夏季可以享受海滨度假，但避开台风季节。\n西北地区（如西安、兰州）：春秋两季气候适宜，夏季较热，冬季寒冷。';
  }

  if (prompt.includes('预算') || prompt.includes('花费') || prompt.includes('费用')) {
    return '旅游预算因目的地、旅行方式和个人消费习惯而异。以下是中国主要城市的大致预算参考（每人每天）：\n\n经济型：300-500元，包含青旅住宿、公共交通和简餐。\n标准型：500-1000元，包含经济型酒店、公共交通和普通餐厅。\n舒适型：1000-2000元，包含舒适型酒店、出租车和品质餐厅。\n豪华型：2000元以上，包含高星级酒店、专车和高档餐厅。\n\n此外，还需考虑景点门票、购物和特色体验的额外费用。建议提前规划行程并预留10-20%的应急资金。';
  }

  if (prompt.includes('行程') || prompt.includes('规划')) {
    return '行程规划建议：\n\n1. 确定旅行天数和预算\n2. 选择2-3个主要目的地，避免行程过于紧凑\n3. 每天安排2-3个主要景点，预留自由活动时间\n4. 考虑交通时间，景点之间的距离\n5. 提前预订热门景点门票和特色体验\n6. 研究当地美食和特色餐厅\n7. 了解当地天气和穿着建议\n8. 准备必要的旅行物品和药品\n9. 购买旅游保险\n10. 制作详细的日程表，但保持一定的灵活性\n\n如果您需要具体城市的行程规划，请告诉我您计划去哪里以及旅行天数。';
  }

  // 处理其他常见旅游问题
  if (prompt.includes('签证') || prompt.includes('护照')) {
    return '出国旅游需要办理护照和目的地国家的签证。中国公民护照办理需要前往当地出入境管理部门，准备身份证、照片等材料。不同国家的签证要求不同，建议提前1-3个月开始准备签证申请。许多国家提供电子签证或落地签证服务，可以简化申请流程。';
  }

  if (prompt.includes('安全') || prompt.includes('注意事项')) {
    return '旅行安全建议：\n\n1. 出行前了解目的地安全状况和紧急联系方式\n2. 购买旅游保险，保留保险公司联系方式\n3. 随身携带必要药品和急救用品\n4. 保管好贵重物品和证件，可以准备复印件\n5. 注意食品和饮水安全，避免生食和未煮沸的水\n6. 尊重当地风俗习惯和宗教信仰\n7. 关注天气预报，避开恶劣天气\n8. 记录下住宿地址和紧急联系人\n9. 保持通讯设备电量充足\n10. 避免夜间单独前往偏僻地区';
  }

  // 默认响应
  return '我是您的旅游助手，可以为您提供旅游目的地推荐、行程规划、景点介绍等信息。请告诉我您想去哪里旅游，或者您对哪个城市感兴趣？您也可以询问关于最佳旅游季节、预算规划或行程安排的建议。';
};


// 处理流式响应的函数
export async function POST(request: NextRequest) {
  try {
    const { prompt } = await request.json();
    
    // 验证请求
    if (!prompt || typeof prompt !== 'string') {
      return NextResponse.json(
        { error: '请提供有效的问题内容' },
        { status: 400 }
      );
    }
    
    // 移除了旅游相关检查，现在可以回答所有问题
    
    // 获取DeepSeek API响应
    const apiResponse = await generateTravelResponse(prompt);
    
    // 如果是流式响应（DeepSeek API返回的事件流），处理JSON格式转换为纯文本
    if (apiResponse.headers.get('content-type')?.includes('text/event-stream')) {
      // 创建一个转换流，将DeepSeek的JSON事件流转换为纯文本
      const transformStream = new TransformStream({
        async transform(chunk, controller) {
          // 将二进制数据转换为文本
          const text = new TextDecoder().decode(chunk);
          
          // 处理事件流中的数据行
          const lines = text.split('\n');
          for (const line of lines) {
            // 跳过空行和非数据行
            if (!line || !line.startsWith('data: ')) continue;
            
            // 提取JSON数据部分
            const jsonData = line.substring(6); // 去掉 'data: '
            
            // 跳过[DONE]消息
            if (jsonData.trim() === '[DONE]') continue;
            
            try {
              // 解析JSON数据
              const data = JSON.parse(jsonData);
              
              // 提取文本内容
              if (data.choices && data.choices.length > 0 && data.choices[0].delta && data.choices[0].delta.content) {
                const content = data.choices[0].delta.content;
                // 将提取的文本内容发送到输出流
                controller.enqueue(new TextEncoder().encode(content));
              }
            } catch (error) {
              console.error('解析DeepSeek API响应时出错:', error, jsonData);
            }
          }
        }
      });
      
      // 将API响应通过转换流处理后返回
      const transformedStream = apiResponse.body.pipeThrough(transformStream);
      
      return new NextResponse(transformedStream, {
        headers: {
          'Content-Type': 'text/plain; charset=utf-8',
          'Cache-Control': 'no-cache',
          'Connection': 'keep-alive',
        },
      });
    }
    
    // 如果不是流式响应，创建一个可读流来模拟流式响应
    const stream = new ReadableStream({
      async start(controller) {
        try {
          // 读取响应文本
          const responseText = await apiResponse.text();
          
          // 模拟流式响应，将回复分成多个部分发送
          // 按句子或短语分割，而不是按空格，以提供更自然的流式体验
          const chunks = responseText.match(/[^.!?。！？]+[.!?。！？]+/g) || [responseText];
          
          for (const chunk of chunks) {
            // 添加延迟以模拟真实的流式响应
            await new Promise(resolve => setTimeout(resolve, 100));
            
            // 将数据块编码为UTF-8并发送
            // 确保字符串是有效的UTF-8编码
            const encoder = new TextEncoder();
            // 先将字符串转换为规范化的形式，再进行编码
            const normalizedChunk = chunk.normalize('NFC');
            controller.enqueue(encoder.encode(normalizedChunk));
          }
        } catch (error) {
          console.error('处理响应时出错:', error);
          const encoder = new TextEncoder();
          controller.enqueue(encoder.encode('抱歉，处理响应时出现错误。'));
        } finally {
          controller.close();
        }
      },
    });

    return new NextResponse(stream, {
      headers: {
        'Content-Type': 'text/plain; charset=utf-8',
        'Transfer-Encoding': 'chunked',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'X-Content-Type-Options': 'nosniff',
      },
    });
  } catch (error) {
    console.error('旅游助手API错误:', error);
    return NextResponse.json({ error: '处理请求时出现错误，请稍后再试' }, { status: 500 });
  }
}

// 移除了isPromptAboutTravel函数，现在旅游助手可以回答所有问题